home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Pascal Super Library
/
Pascal Super Library (CW International)(1997).bin
/
MATH
/
MATH1
/
LEAST6.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1985-04-03
|
4KB
|
149 lines
program least3; { --> 226 }
{ Pascal program to perform a linear least-squares fit }
{ on the properties of steam with Gauss-Jordan routine }
{ Seperate modules needed:
GAUSSJ}
const maxr = 20; { data prints }
maxc = 4; { polynomial terms }
type ary = array[1..maxr] of real;
arys = array[1..maxc] of real;
ary2 = array[1..maxr,1..maxc] of real;
ary2s = array[1..maxc,1..maxc] of real;
var p,t,v,
y,y_calc : ary;
resid : ary;
coef,sig : arys;
nrow,ncol : integer;
correl_coef : real;
external procedure cls;
procedure get_data(var p,t: ary; { independant variable }
var v: ary; { dependant variable }
var nrow: integer); { length of vectors }
{ get values for n and arrays x,y }
var i : integer;
begin
nrow:=12;
t[1]:=400; p[1]:=120; v[1]:=4.079;
t[2]:=450; p[2]:=120; v[2]:=4.36;
t[3]:=500; p[3]:=120; v[3]:=4.633;
t[4]:=400; p[4]:=140; v[4]:=3.466;
t[5]:=450; p[5]:=140; v[5]:=3.713;
t[6]:=500; p[6]:=140; v[6]:=3.952;
t[7]:=400; p[7]:=160; v[7]:=3.007;
t[8]:=450; p[8]:=160; v[8]:=3.228;
t[9]:=500; p[9]:=160; v[9]:=3.440;
t[10]:=400; p[10]:=180; v[10]:=2.648;
t[11]:=450; p[11]:=180; v[11]:=2.850;
t[12]:=500; p[12]:=180; v[12]:=3.042;
for i:=1 to nrow do
t[i]:=t[i]+460.0 { convert to Rankine }
end; { proceddure get data }
procedure write_data;
{ print out the answers }
var i : integer;
begin
writeln;
writeln(' I P T V Y YCALC %RES');
for i:=1 to nrow do
writeln(i:3,p[i]:7:1,t[i]:7:1,v[i]:7:3,y[i]:9:2,y_calc[i]:9:2,
(100.0*resid[i]/y[i]):9:2);
writeln; writeln(' Coefficients errors ');
writeln(coef[1],' ',sig[1],' Constant term');
for i:=2 to ncol do
writeln(coef[i],' ',sig[i]); { other terms }
writeln;
writeln('Correlation coefficient is ',correl_coef:8:5)
end; { write_data }
{procedure square(x: ary2;
y: ary;
var a: ary2s;
var g: arys;
nrow,ncol: integer);}
{ matrix multiplication routine }
{ a= transpose x times x }
{ g= y times x }
{$I SQUARE.LIB }
{external procedure gaussj(var b: ary2s;
y: arys;
var coef: arys;
ncol: integer;
var error: boolean);
}
{$I GAUSSJ.LIB }
procedure linfit(p,t,v: ary; { independant variable }
var y: ary; { dependent variable }
var y_calc: ary; { calculated dep. variable }
var resid: ary; { array of residuals }
var coef: arys; { coefficients }
var sig: arys; { error on coefficients }
nrow: integer; { length of array }
var ncol: integer); { number of terms }
{ least squares fit to nrow sets of x and y pairs of points }
{ Seperate procedures needed:
SQUARE -> form square coefficient matrix
GAUSSJ -> Gauss-Jordan elimination }
const r = 85.76; { gas constant for steam }
var xmatr : ary2; { data matrix }
a : ary2s; { coefficient matrix }
g : arys; { constant vector }
error : boolean;
i,j,nm : integer;
power,yi,yc,srs,see,
sum_y,sum_y2 : real;
begin { procedure linfit }
ncol:=2; { number of terms }
for i:=1 to nrow do
begin { setup matrix }
power:=t[i];
xmatr[i,1]:=p[i]/power; { first column }
xmatr[i,2]:=sqrt(p[i]); { second column }
y[i]:=v[i]*p[i]-r*t[i]/144.0
end;
square(xmatr,y,a,g,nrow,ncol);
gaussj(a,g,coef,ncol,error);
sum_y:=0.0;
sum_y2:=0.0;
srs:=0.0;
for i:=1 to nrow do
begin
yi:=y[i];
yc:=0.0;
for j:=1 to ncol do
yc:=yc+coef[j]*xmatr[i,j];
y_calc[i]:=yc;
resid[i]:=yc-yi;
srs:=srs+sqr(resid[i]);
sum_y:=sum_y+yi;
sum_y2:=sum_y2+yi*yi
end;
correl_coef:=sqrt(1.0-srs/(sum_y2-sqr(sum_y)/nrow));
if nrow=ncol then nm:=1
else nm:=nrow-ncol;
see:=sqrt(srs/nm);
for i:=1 to ncol do { errors on solution }
sig[i]:=see*sqrt(a[i,i])
end; { linfit }
begin { main program }
cls;
get_data(p,t,v,nrow);
linfit(p,t,v,y,y_calc,resid,coef,sig,nrow,ncol);
write_data
end.